home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-03 / zcom10.zip / ZCOMTEST.BAS < prev    next >
BASIC Source File  |  1992-02-15  |  8KB  |  242 lines

  1.  
  2. DEFINT A-Z
  3.  
  4. DECLARE FUNCTION ZCOM% (BYVAL vseg%, BYVAL voff%)
  5.  
  6. '------------------------------------------------------------------------
  7. 'ZCOM is a very small modem module written in assembly language that will
  8. 'work with any 80x86 compiler language capable of passing a far pointer by
  9. 'value to an external object. This interface example is in QuickBASIC.
  10.  
  11. 'Note: I'm not providing any documentation other than what is in this
  12. 'source code example. If you can't figure it out from this then you
  13. 'need more study. After all, yesterday I knew next to nothing about
  14. 'serial communications. Nothing to it.
  15.  
  16. 'ZCOM is Copyright (C)1992 Cornel Huth, All Rights Reserved.
  17. 'ZCOMTEST is Copyright (C)1992 Cornel Huth
  18. '15-Feb-1992
  19. '
  20. 'Any use of this package beyond the first use requires that you register.
  21. 'To register, write by letter or postcard:
  22. '
  23. 'Print your name and complete mailing address.
  24. 'Computer hardware you use--be specific.
  25. 'Operating systems you use and years experience with them; your favorite.
  26. 'Compilers you use and years experience with them; your favorite.
  27. 'Have you written any shareware programs? Specify.
  28. 'Have you registered any shareware programs? Specify.
  29. '
  30. 'Mail your registration to:
  31. '
  32. ' Cornel Huth
  33. ' 6402 INGRAM RD
  34. ' SAN ANTONIO, TX 78238-3915 U.S.A.
  35. '
  36. 'You won't regret it.
  37. '--------------------
  38.  
  39. TYPE DialModemPackTYPE
  40. Func AS INTEGER                 'function to perform 0,1,2
  41. stat AS INTEGER                 'status of function, currently always 0
  42. BasePort AS INTEGER             'address of COM device, e.g., &H02F8
  43. IRQ AS INTEGER                  'IRQ of COM device, 3 or 4 only
  44. Baud AS INTEGER                 'speed of device 300-115,200bps
  45. ComParms AS INTEGER             'line control register value (see below)
  46. BufferSize AS INTEGER           'size of input buffer
  47. BufferPtrOff AS INTEGER         'offset of input buffer (data from modem)
  48. BufferPtrSeg AS INTEGER         'segment
  49. InPtrOff AS INTEGER             'offset of input buffer's current index
  50. InPtrSeg AS INTEGER             'segment
  51. StringPtrOff AS INTEGER         'offset of output buffer (data to modem)
  52. StringPtrSeg AS INTEGER         'segment
  53. END TYPE
  54. DIM DMP AS DialModemPackTYPE    'DMP is what ZCOM uses
  55.  
  56. 'ComParms value derived from:
  57. '
  58. '  bits 7      6      543      2    1 0
  59. '      Rez   BREAK   Parity   Stop  Word
  60. '       0    1=SPC  000=None  0=1   10=7
  61. '                   001=Odd   1=2   11=8
  62. '                   011=Even
  63. 'For example:
  64. 'N18 = 00000011 binary, or 2 (no parity, 1 stop bit, 8-bit word)
  65. 'E17 = 00011010b, or 1Ah, or 26 decimal (even parity, 1 stop bit, 7-bit word)
  66.  
  67. DIM SHARED InIndex AS INTEGER   'input index of buffer (used by ZCOM)
  68. DIM SHARED OutIndex AS INTEGER  'output index of buffer (used by ZCOMTEST)
  69. DIM SHARED Buffer AS STRING * 64 'the input buffer filled by the ISR
  70. DIM SHARED Strg AS STRING * 40  'string passed to modem for modem to output
  71.  
  72. DIM SHARED ZSTR AS STRING * 1   '0T (CHR$(0)) passed string must end with 0T
  73. DIM SHARED CRLF AS STRING * 2   'CHR$(13)+CHR$(10) needed by most modem strngs
  74.  
  75. CLS
  76.  
  77. ZSTR = CHR$(0)                  '0T zero-terminator
  78. CRLF = CHR$(13) + CHR$(10)
  79.  
  80. InIndex = 0     'when InIndex=OutIndex the input buffer is empty and thus
  81. OutIndex = 0    'there's nothing to output from the modem
  82.  
  83. DMP.Func = 0                    '0=install ZCOM function
  84. DMP.stat = 0
  85. DMP.BasePort = &H2F8            'COM2 default port address
  86. DMP.IRQ = 3                     'COM2 default IRQ
  87. DMP.Baud = 2400
  88. DMP.ComParms = 2                '8N1
  89. DMP.BufferSize = LEN(Buffer)
  90. DMP.BufferPtrOff = VARPTR(Buffer)
  91. DMP.BufferPtrSeg = VARSEG(Buffer)
  92. DMP.InPtrOff = VARPTR(InIndex)
  93. DMP.InPtrSeg = VARSEG(InIndex)
  94. DMP.StringPtrOff = VARPTR(Strg)
  95. DMP.StringPtrSeg = VARSEG(Strg)
  96. stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
  97. PRINT "Install stat:"; stat
  98. PRINT "Press Esc to exit dialing!"
  99. DO
  100.    'A ~ (ASCII 126) in a modem string instructs ZCOM to pause 1/2 second.
  101.    'It really should only be used before an AT command or after the CRLF.
  102.    'For example, in "ATDT2~2~6~-3~2~3~2" + CRLF + ZSTR, the half-second
  103.    'delays will not affect the dial delay between numbers--use the modem's
  104.    'built-in delay for that: , (comma).
  105.  
  106.    'wait 1/2 second, send hangup string, wait 1 second
  107.  
  108.    DMP.Func = 2                                 '2=write to modem function
  109.    Strg = "~~ATH0" + CRLF + "~~" + ZSTR
  110.    stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
  111.    GOSUB ReadBuffer
  112.  
  113.    'send dial string
  114.  
  115.    DMP.Func = 2
  116.    Strg = "ATDT615-6853" + CRLF + ZSTR
  117.    stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
  118.  
  119.    'track modem response
  120.    'here just check for likely reponses that we care about
  121.  
  122.    Trap = 0
  123.    IsBusy = 0
  124.    IsConnect = 0
  125.    IsNoCarrier = 0
  126.    DO
  127.       GOSUB ReadBuffer
  128.       IF Trap = 0 THEN
  129.          SELECT CASE inchar
  130.          CASE 66  'B-USY
  131.             Trap = 1
  132.          CASE 67  'C-ONNECT
  133.             Trap = 11
  134.          CASE 78  'N-O CARRIER
  135.             Trap = 21
  136.          CASE ELSE
  137.          END SELECT
  138.       ELSE
  139.          SELECT CASE Trap
  140.          CASE IS <= 10
  141.             IF CHR$(inchar) = MID$("BUSY", Trap + 1, 1) THEN
  142.                Trap = Trap + 1
  143.                IF Trap = 4 THEN IsBusy = -1: Trap = 0
  144.             END IF
  145.          CASE IS <= 20
  146.             IF CHR$(inchar) = MID$("CONNECT", Trap - 10 + 1, 1) THEN
  147.                Trap = Trap + 1
  148.                IF Trap = 17 THEN IsConnect = -1: Trap = 0
  149.             END IF
  150.          CASE IS <= 30
  151.             IF CHR$(inchar) = MID$("NO CARRIER", Trap - 20 + 1, 1) THEN
  152.                Trap = Trap + 1
  153.                IF Trap = 30 THEN IsNoCarrier = -1: Trap = 0
  154.             END IF
  155.          CASE ELSE
  156.             Trap = 0
  157.          END SELECT
  158.       END IF
  159.       GOSUB WriteChar
  160.       IF outchar = 27 THEN EXIT DO
  161.    LOOP UNTIL IsBusy OR IsConnect OR IsNoCarrier
  162.    IF outchar = 27 THEN EXIT DO
  163. LOOP WHILE IsBusy OR IsNoCarrier
  164.  
  165. 'if we got a CONNECT then make like a terminal (crude one, anyway)
  166.  
  167. IF IsConnect THEN
  168.    DMP.Func = 2         'wait a 1/2 second for connect speed (1200,2400,etc)
  169.    Strg = "~" + ZSTR
  170.    stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
  171.    GOSUB ReadBuffer
  172.    PRINT "Press F7 to hangup!"   'any extended key hangs up here
  173.    DO
  174.       GOSUB ReadBuffer
  175.       GOSUB WriteChar
  176.    LOOP UNTIL outchar < 0 'hit an extended key and we hangup! See WriteChar
  177. END IF
  178.  
  179. 'switch to command mode, wait 1 second before, 1 second after (at least)
  180. '--1 second is usually enough but may need to be longer depending on the
  181. 'modem's configuration.
  182.  
  183. DMP.Func = 2
  184. Strg = "~~+++~~" + ZSTR
  185. stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
  186. GOSUB ReadBuffer
  187.  
  188. 'send hangup string then wait 1 second
  189.  
  190. DMP.Func = 2
  191. Strg = "ATH0" + CRLF + "~~" + ZSTR
  192. stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
  193. GOSUB ReadBuffer
  194.  
  195. 'uninstall ZCOM
  196.  
  197. DMP.Func = 1                              '0=uninstall ZCOM function
  198. stat = ZCOM(VARSEG(DMP), VARPTR(DMP))  'you must call this before exiting
  199. GOSUB ReadBuffer
  200. PRINT "Uninstall stat:"; stat
  201. END
  202.  
  203. '----------------------------------------
  204. 'read incoming characters from the buffer
  205. 'put there by the ZCOM ISR
  206.  
  207. ReadBuffer:
  208. DO WHILE OutIndex <> InIndex
  209.    inchar = ASC(MID$(Buffer, OutIndex + 1, 1))
  210.    SELECT CASE inchar
  211.    CASE 13
  212.       PRINT
  213.    CASE 10
  214.    CASE 8, 127  'do a backspace, however it's done in BASIC
  215.    CASE IS < 32
  216.    CASE ELSE
  217.       PRINT CHR$(inchar);
  218.    END SELECT
  219.    OutIndex = OutIndex + 1
  220.    IF OutIndex = DMP.BufferSize THEN OutIndex = 0
  221. LOOP
  222. RETURN
  223.  
  224. '-----------------------------------------
  225. 'write the character, if any, to the modem
  226.  
  227. WriteChar:
  228. k$ = INKEY$
  229. SELECT CASE LEN(k$)
  230. CASE 1  'only standard keys here
  231.    outchar = ASC(k$)
  232.    Strg = k$ + ZSTR
  233.    DMP.Func = 2
  234.    stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
  235. CASE 2
  236.    outchar = -1
  237. CASE ELSE
  238.    outchar = 0
  239. END SELECT
  240. RETURN
  241.  
  242.